{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "print(tf.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import csv\n",
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "from tensorflow.keras.preprocessing.text import Tokenizer\n",
    "from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
    "from nltk.corpus import stopwords\n",
    "STOPWORDS = set(stopwords.words('english'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "vocab_size = 5000\n",
    "embedding_dim = 64\n",
    "max_length = 200\n",
    "trunc_type = 'post'\n",
    "padding_type = 'post'\n",
    "oov_tok = '<OOV>'\n",
    "training_portion = .8"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2225\n",
      "2225\n"
     ]
    }
   ],
   "source": [
    "articles = []\n",
    "labels = []\n",
    "\n",
    "with open(\"bbc-text.csv\", 'r') as csvfile:\n",
    "    reader = csv.reader(csvfile, delimiter=',')\n",
    "    next(reader)\n",
    "    for row in reader:\n",
    "        labels.append(row[0])\n",
    "        article = row[1]\n",
    "        for word in STOPWORDS:\n",
    "            token = ' ' + word + ' '\n",
    "            article = article.replace(token, ' ')\n",
    "            article = article.replace(' ', ' ')\n",
    "        articles.append(article)\n",
    "print(len(labels))\n",
    "print(len(articles))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1780\n",
      "1780\n",
      "1780\n",
      "445\n",
      "445\n"
     ]
    }
   ],
   "source": [
    "train_size = int(len(articles) * training_portion)\n",
    "\n",
    "train_articles = articles[0: train_size]\n",
    "train_labels = labels[0: train_size]\n",
    "\n",
    "validation_articles = articles[train_size:]\n",
    "validation_labels = labels[train_size:]\n",
    "\n",
    "print(train_size)\n",
    "print(len(train_articles))\n",
    "print(len(train_labels))\n",
    "print(len(validation_articles))\n",
    "print(len(validation_labels))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "425\n",
      "200\n",
      "192\n",
      "200\n",
      "186\n",
      "200\n"
     ]
    }
   ],
   "source": [
    "tokenizer = Tokenizer(num_words = vocab_size, oov_token=oov_tok)\n",
    "tokenizer.fit_on_texts(train_articles)\n",
    "word_index = tokenizer.word_index\n",
    "\n",
    "train_sequences = tokenizer.texts_to_sequences(train_articles)\n",
    "train_padded = pad_sequences(train_sequences, maxlen=max_length, padding=padding_type, truncating=trunc_type)\n",
    "\n",
    "print(len(train_sequences[0]))\n",
    "print(len(train_padded[0]))\n",
    "\n",
    "print(len(train_sequences[1]))\n",
    "print(len(train_padded[1]))\n",
    "\n",
    "print(len(train_sequences[10]))\n",
    "print(len(train_padded[10]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "445\n",
      "(445, 200)\n"
     ]
    }
   ],
   "source": [
    "validation_sequences = tokenizer.texts_to_sequences(validation_articles)\n",
    "validation_padded = pad_sequences(validation_sequences, maxlen=max_length, padding=padding_type, truncating=trunc_type)\n",
    "\n",
    "print(len(validation_sequences))\n",
    "print(validation_padded.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "label_tokenizer = Tokenizer()\n",
    "label_tokenizer.fit_on_texts(labels)\n",
    "\n",
    "training_label_seq = np.array(label_tokenizer.texts_to_sequences(train_labels))\n",
    "validation_label_seq = np.array(label_tokenizer.texts_to_sequences(validation_labels))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "embedding (Embedding)        (None, 200, 64)           320000    \n",
      "_________________________________________________________________\n",
      "conv1d (Conv1D)              (None, 196, 128)          41088     \n",
      "_________________________________________________________________\n",
      "global_average_pooling1d (Gl (None, 128)               0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 64)                8256      \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 6)                 390       \n",
      "=================================================================\n",
      "Total params: 369,734\n",
      "Trainable params: 369,734\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = tf.keras.Sequential([\n",
    "    tf.keras.layers.Embedding(vocab_size, embedding_dim,\n",
    "                             input_length=max_length),\n",
    "    # specify the number of convolutions that you want to learn, their size, and their activation function.\n",
    "    # words will be grouped into the size of the filter in this case 5\n",
    "    tf.keras.layers.Conv1D(128, 5, activation='relu'),\n",
    "    tf.keras.layers.GlobalAveragePooling1D(),\n",
    "    tf.keras.layers.Dense(64, activation='relu'),\n",
    "    tf.keras.layers.Dense(6, activation='softmax')\n",
    "])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When we look at the summary of the model, the size of the input was 200 words, and a filter that is 5 words long will shave off 2 words from the front and back, leaving us with 196. The 128 filters that we specified will show up here as part of the convolutional layer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 1780 samples, validate on 445 samples\n",
      "Epoch 1/10\n",
      "1780/1780 - 2s - loss: 1.5898 - accuracy: 0.2961 - val_loss: 1.2767 - val_accuracy: 0.7820\n",
      "Epoch 2/10\n",
      "1780/1780 - 1s - loss: 0.5917 - accuracy: 0.9253 - val_loss: 0.2134 - val_accuracy: 0.9596\n",
      "Epoch 3/10\n",
      "1780/1780 - 1s - loss: 0.0758 - accuracy: 0.9876 - val_loss: 0.1423 - val_accuracy: 0.9573\n",
      "Epoch 4/10\n",
      "1780/1780 - 1s - loss: 0.0249 - accuracy: 0.9989 - val_loss: 0.1068 - val_accuracy: 0.9708\n",
      "Epoch 5/10\n",
      "1780/1780 - 1s - loss: 0.0109 - accuracy: 1.0000 - val_loss: 0.0964 - val_accuracy: 0.9708\n",
      "Epoch 6/10\n",
      "1780/1780 - 1s - loss: 0.0056 - accuracy: 1.0000 - val_loss: 0.0980 - val_accuracy: 0.9685\n",
      "Epoch 7/10\n",
      "1780/1780 - 1s - loss: 0.0038 - accuracy: 1.0000 - val_loss: 0.0943 - val_accuracy: 0.9708\n",
      "Epoch 8/10\n",
      "1780/1780 - 1s - loss: 0.0026 - accuracy: 1.0000 - val_loss: 0.0941 - val_accuracy: 0.9730\n",
      "Epoch 9/10\n",
      "1780/1780 - 1s - loss: 0.0020 - accuracy: 1.0000 - val_loss: 0.0934 - val_accuracy: 0.9708\n",
      "Epoch 10/10\n",
      "1780/1780 - 1s - loss: 0.0015 - accuracy: 1.0000 - val_loss: 0.0930 - val_accuracy: 0.9708\n"
     ]
    }
   ],
   "source": [
    "num_epochs = 10\n",
    "history = model.fit(train_padded, training_label_seq, epochs=num_epochs, validation_data=(validation_padded, validation_label_seq), verbose=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our accuracy does even better than before with 100% on training and around 97% on validation. The validation loss did not increase. \n",
    "\n",
    "As we have a super simple network here, it's not surprising, and it will take some experimentation with different combinations of convolutional layers to improve on this."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_graphs(history, string):\n",
    "  plt.plot(history.history[string])\n",
    "  plt.plot(history.history['val_'+string])\n",
    "  plt.xlabel(\"Epochs\")\n",
    "  plt.ylabel(string)\n",
    "  plt.legend([string, 'val_'+string])\n",
    "  plt.show()\n",
    "  \n",
    "plot_graphs(history, \"accuracy\")\n",
    "plot_graphs(history, \"loss\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1.7301310e-06 7.7033889e-01 1.4999783e-01 3.2835379e-02 1.4933100e-05\n",
      "  4.6811122e-02]] bussiness\n"
     ]
    }
   ],
   "source": [
    "txt = [\"A WeWork shareholder has taken the company to court over the near-$1.7bn (£1.3bn) leaving package approved for ousted co-founder Adam Neumann.\"]\n",
    "seq = tokenizer.texts_to_sequences(txt)\n",
    "padded = pad_sequences(seq, maxlen=max_length)\n",
    "pred = model.predict(padded)\n",
    "labels = ['sport', 'bussiness', 'politics', 'tech', 'entertainment']\n",
    "print(pred, labels[np.argmax(pred)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
